#!/bin/bash

if test x"$1" = x"-h" -o x"$1" = x"--help" ; then
cat <<EOF
Usage: ./configure [options]

available options:

  --help                   print this message
  --disable-cli            disables cli
  --system-libx264         use system libx264 instead of internal
  --enable-shared          build shared library
  --enable-static          build static library
  --disable-avs            disables avisynth support (windows only)
  --disable-lavf           disables libavformat support
  --disable-ffms           disables ffmpegsource support
  --disable-gpac           disables gpac support
  --disable-gpl            disables GPL-only features
  --disable-thread         disables multithreaded encoding
  --enable-win32thread     use win32threads (windows only)
  --disable-swscale        disables swscale support
  --disable-asm            disables platform-specific assembly optimizations
  --disable-interlaced     disables interlaced encoding support
  --enable-debug           adds -g
  --enable-gprof           adds -pg
  --enable-strip           adds -s
  --enable-visualize       enables visualization (X11 only)
  --enable-pic             build position-independent code
  --bit-depth=BIT_DEPTH    sets output bit depth (8-10), default 8
  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
  --host=HOST              build programs to run on HOST
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

EOF
exit 1
fi

log_check() {
    echo -n "checking $1... " >> config.log
}

log_ok() {
    echo "yes" >> config.log
}

log_fail() {
    echo "no" >> config.log
}

log_msg() {
    echo "$1" >> config.log
}

intel_cflags() {
    # Intel Compiler issues an incredibly large number of warnings on any warning level,
    # suppress them by disabling all warnings rather than having to use #pragmas to disable most of them
    for arg in $*; do
        [ $arg = -ffast-math ] && arg=
        [[ "$arg" = -falign-loops* ]] && arg=
        [ "$arg" = -fno-tree-vectorize ] && arg=
        [ "$arg" = -Wshadow ] && arg=
        if [ $compiler = ICL ]; then
            [ "$arg" = -Wall ] && arg=-W0
            [ "$arg" = -g ] && arg=-Z7
            [ "$arg" = -fomit-frame-pointer ] && arg=
            [ "$arg" = -s ] && arg=
            [ "$arg" = -fPIC ] && arg=
        else
            [ "$arg" = -Wall ] && arg=-w0
        fi

        [ -n "$arg" ] && echo -n "$arg "
    done
}

icl_ldflags() {
    for arg in $*; do
        arg=${arg/LIBPATH/libpath}
        [ ${arg#-libpath:} == $arg -a ${arg#-l} != $arg ] && arg=${arg#-l}.lib
        [ ${arg#-L} != $arg ] && arg=-libpath:${arg#-L}
        [ $arg = -Wl,--large-address-aware ] && arg=-largeaddressaware
        [ $arg = -s ] && arg=
        [ "$arg" = -Wl,-Bsymbolic ] && arg=

        arg=${arg/pthreadGC/pthreadVC}
        [ "$arg" = avifil32.lib ] && arg=vfw32.lib
        [ "$arg" = gpac_static.lib ] && arg=libgpac_static.lib

        [ -n "$arg" ] && echo -n "$arg "
    done
}

cc_check() {
    if [ -z "$3" ]; then
        if [ -z "$1$2" ]; then
            log_check "whether $CC works"
        elif [ -z "$1" ]; then
            log_check "for $2"
        else
            log_check "for $1"
        fi
    elif [ -z "$1" ]; then
        if [ -z "$2" ]; then
            log_check "whether $CC supports $3"
        else
            log_check "whether $CC supports $3 with $2"
        fi
    else
        log_check "for $3 in $1";
    fi
    rm -f conftest.c
    [ -n "$1" ] && echo "#include <$1>" > conftest.c
    echo "int main () { $3 return 0; }" >> conftest.c
    if [ $compiler = ICL ]; then
        cc_cmd="$CC conftest.c $CFLAGS $2 -link $(icl_ldflags $2 $LDFLAGSCLI $LDFLAGS)"
    else
        cc_cmd="$CC conftest.c $CFLAGS $2 $LDFLAGSCLI $LDFLAGS -o conftest"
    fi
    if $cc_cmd >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "Failed commandline was:"
        log_msg "--------------------------------------------------"
        log_msg "$cc_cmd"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
        log_msg "Failed program was:"
        log_msg "--------------------------------------------------"
        cat conftest.c >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

cpp_check() {
    log_check "whether $3 is true"
    rm -f conftest.c
    [ -n "$1" ] && echo "#include <$1>" > conftest.c
    echo -e "#if !($3) \n#error $4 \n#endif " >> conftest.c

    if $CC conftest.c $CFLAGS $2 -E -o conftest >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "--------------------------------------------------"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
        log_msg "Failed program was:"
        log_msg "--------------------------------------------------"
        cat conftest.c >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

as_check() {
    log_check "whether $AS supports $1"
    echo "$1" > conftest.asm
    if $AS conftest.asm $ASFLAGS $2 -o conftest.o >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "Failed commandline was:"
        log_msg "--------------------------------------------------"
        log_msg "$AS conftest.asm $ASFLAGS $2 -o conftest.o"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
        log_msg "Failed program was:"
        log_msg "--------------------------------------------------"
        cat conftest.asm >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

define() {
    echo "#define $1$([ -n "$2" ] && echo " $2" || echo " 1")" >> config.h
}

die() {
    log_msg "DIED: $@"
    echo "$@"
    exit 1
}

rm -f x264_config.h config.h config.mak config.log x264.pc x264.def conftest*

prefix='/usr/local'
exec_prefix='${prefix}'
bindir='${exec_prefix}/bin'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
DEVNULL='/dev/null'

cli="yes"
cli_libx264="internal"
shared="no"
static="no"
avs="auto"
lavf="auto"
ffms="auto"
gpac="internal"
gpl="yes"
thread="auto"
swscale="auto"
asm="auto"
interlaced="yes"
debug="no"
gprof="no"
strip="no"
pic="no"
vis="no"
bit_depth="8"
compiler="GNU"

CFLAGS="$CFLAGS -Wall -I."
LDFLAGS="$LDFLAGS"
LDFLAGSCLI="$LDFLAGSCLI"
ASFLAGS="$ASFLAGS"
HAVE_GETOPT_LONG=1
cross_prefix=""

EXE=""

# list of all preprocessor HAVE values we can define
CONFIG_HAVE="MALLOC_H ALTIVEC ALTIVEC_H MMX ARMV6 ARMV6T2 NEON BEOSTHREAD POSIXTHREAD WIN32THREAD THREAD LOG2F VISUALIZE SWSCALE LAVF FFMS GPAC GF_MALLOC AVS GPL VECTOREXT INTERLACED"

# parse options

for opt do
    optarg="${opt#*=}"
    case "$opt" in
        --prefix=*)
            prefix="$optarg"
            ;;
        --exec-prefix=*)
            exec_prefix="$optarg"
            ;;
        --bindir=*)
            bindir="$optarg"
            ;;
        --libdir=*)
            libdir="$optarg"
            ;;
        --includedir=*)
            includedir="$optarg"
            ;;
        --disable-cli)
            cli="no"
            ;;
        --system-libx264)
            cli_libx264="system"
            ;;
        --enable-shared)
            shared="yes"
            ;;
        --enable-static)
            static="yes"
            ;;
        --disable-asm)
            asm="no"
            ;;
        --disable-interlaced)
            interlaced="no"
            ;;
        --disable-avs)
            avs="no"
            ;;
        --disable-lavf)
            lavf="no"
            ;;
        --disable-ffms)
            ffms="no"
            ;;
        --disable-gpac)
            gpac="no"
            ;;
        --disable-gpl)
            gpl="no"
            ;;
        --extra-asflags=*)
            ASFLAGS="$ASFLAGS ${opt#--extra-asflags=}"
            ;;
        --extra-cflags=*)
            CFLAGS="$CFLAGS ${opt#--extra-cflags=}"
            ;;
        --extra-ldflags=*)
            LDFLAGS="$LDFLAGS ${opt#--extra-ldflags=}"
            ;;
        --disable-thread)
            thread="no"
            ;;
        --enable-win32thread)
            thread="win32"
            ;;
        --disable-swscale)
            swscale="no"
            ;;
        --enable-debug)
            debug="yes"
            ;;
        --enable-gprof)
            CFLAGS="$CFLAGS -pg"
            LDFLAGS="$LDFLAGS -pg"
            gprof="yes"
            ;;
        --enable-strip)
            strip="yes"
            ;;
        --enable-pic)
            pic="yes"
            ;;
        --enable-visualize)
            vis="yes"
            ;;
        --host=*)
            host="${opt#--host=}"
            ;;
        --cross-prefix=*)
            cross_prefix="${opt#--cross-prefix=}"
            ;;
        --sysroot=*)
            CFLAGS="$CFLAGS --sysroot=${opt#--sysroot=}"
            LDFLAGS="$LDFLAGS --sysroot=${opt#--sysroot=}"
            ;;
        --bit-depth=*)
            bit_depth="${opt#--bit-depth=}"
            if [ "$bit_depth" -lt "8" -o "$bit_depth" -gt "10" ]; then
                echo "Supplied bit depth must be in range [8,10]."
                exit 1
            fi
            bit_depth=`expr $bit_depth + 0`
            ;;
        *)
            echo "Unknown option $opt, ignored"
            ;;
    esac
done

[ "$cli" = "no" -a "$shared" = "no" -a "$static" = "no" ] && die "Nothing to build. Enable cli, shared or static."

CC="${CC-${cross_prefix}gcc}"
AR="${AR-${cross_prefix}ar}"
RANLIB="${RANLIB-${cross_prefix}ranlib}"
STRIP="${STRIP-${cross_prefix}strip}"

if [ "x$host" = x ]; then
    host=`./config.guess`
fi
# normalize a triplet into a quadruplet
host=`./config.sub $host`

# split $host
host_cpu="${host%%-*}"
host="${host#*-}"
host_vendor="${host%%-*}"
host_os="${host#*-}"

# test for use of Intel Compiler
if [[ $host_os = mingw* || $host_os = cygwin* ]]; then
    if [[ `basename "$CC"` = icl* ]]; then
        # Windows Intel Compiler creates dependency generation with absolute Windows paths, Cygwin's make does not support Windows paths.
        [[ $host_os = cygwin* ]] && die "Windows Intel Compiler support requires MSYS"
        compiler=ICL
        CFLAGS="$CFLAGS -Qstd=c99 -nologo -Qms0 -DHAVE_STRING_H -Iextras"
        QPRE="-Q"
        `$CC 2>&1 | grep -q IA-32` && host_cpu=i486
        `$CC 2>&1 | grep -q "Intel(R) 64"` && host_cpu=x86_64
        cpp_check "" "" "_MSC_VER >= 1400" || die "Windows Intel Compiler support requires Visual Studio 2005 or newer"
    fi
else
    if [[ `basename "$CC"` = icc* ]]; then
        AR="xiar"
        compiler=ICC
        QPRE="-"
    fi
fi

case $host_os in
    beos*)
        SYS="BEOS"
        define HAVE_MALLOC_H
        ;;
    darwin*)
        SYS="MACOSX"
        CFLAGS="$CFLAGS -falign-loops=16"
        LDFLAGS="$LDFLAGS -lm"
        if [ "$pic" = "no" ]; then
            cc_check "" -mdynamic-no-pic && CFLAGS="$CFLAGS -mdynamic-no-pic"
        fi
        ;;
    freebsd*)
        SYS="FREEBSD"
        LDFLAGS="$LDFLAGS -lm"
        ;;
    kfreebsd*-gnu)
        SYS="FREEBSD"
        define HAVE_MALLOC_H
        LDFLAGS="$LDFLAGS -lm"
        ;;
    netbsd*)
        SYS="NETBSD"
        LDFLAGS="$LDFLAGS -lm"
        ;;
    openbsd*)
        SYS="OPENBSD"
        LDFLAGS="$LDFLAGS -lm"
        ;;
    *linux*)
        SYS="LINUX"
        define HAVE_MALLOC_H
        LDFLAGS="$LDFLAGS -lm"
        ;;
    cygwin*)
        EXE=".exe"
        if cc_check "" -mno-cygwin; then
            CFLAGS="$CFLAGS -mno-cygwin"
            LDFLAGS="$LDFLAGS -mno-cygwin"
        fi
        if cpp_check "" "" "defined(__CYGWIN32__)" ; then
            define HAVE_MALLOC_H
            SYS="CYGWIN"
        else
            SYS="WINDOWS"
            DEVNULL="NUL"
        fi
        ;;
    mingw*)
        SYS="WINDOWS"
        EXE=".exe"
        DEVNULL="NUL"
        ;;
    sunos*|solaris*)
        SYS="SunOS"
        define HAVE_MALLOC_H
        LDFLAGS="$LDFLAGS -lm"
        HAVE_GETOPT_LONG=0
        ;;
    *)
        die "Unknown system $host, edit the configure"
        ;;
esac

case $host_cpu in
    i*86)
        ARCH="X86"
        AS="yasm"
        ASFLAGS="$ASFLAGS -O2"
        if [ $compiler = GNU ]; then
            if [[ "$asm" == auto && "$CFLAGS" != *-march* ]]; then
                CFLAGS="$CFLAGS -march=i686"
            fi
            if [[ "$asm" == auto && "$CFLAGS" != *-mfpmath* ]]; then
                CFLAGS="$CFLAGS -mfpmath=sse -msse"
            fi
        else
            # icc on linux has various degrees of mod16 stack support
            if [ $SYS = LINUX ]; then
                # < 11 is completely incapable of keeping a mod16 stack
                if cpp_check "" "" "__INTEL_COMPILER < 1100" ; then
                    define BROKEN_STACK_ALIGNMENT
                # 11 <= x < 12 is capable of keeping a mod16 stack, but defaults to not doing so.
                elif cpp_check "" "" "__INTEL_COMPILER < 1200" ; then
                    CFLAGS="$CFLAGS -falign-stack=assume-16-byte"
                fi
                # >= 12 defaults to a mod16 stack
            fi
            # icl on windows has no mod16 stack support
            [ $SYS = WINDOWS ] && define BROKEN_STACK_ALIGNMENT
        fi
        if [ "$SYS" = MACOSX ]; then
            ASFLAGS="$ASFLAGS -f macho -DPREFIX"
        elif [ "$SYS" = WINDOWS -o "$SYS" = CYGWIN ]; then
            ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
            LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
        else
            ASFLAGS="$ASFLAGS -f elf"
        fi
        ;;
    x86_64)
        ARCH="X86_64"
        AS="yasm"
        if [ "$SYS" = MACOSX ]; then
            ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX"
            if cc_check '' "-arch x86_64"; then
                CFLAGS="$CFLAGS -arch x86_64"
                LDFLAGS="$LDFLAGS -arch x86_64"
            fi
        elif [ "$SYS" = WINDOWS ]; then
            ASFLAGS="$ASFLAGS -f win32 -m amd64"
            # only the GNU toolchain is inconsistent in prefixing function names with _
            [ $compiler = GNU ] && cc_check "" "-S" && grep -q "_main:" conftest && ASFLAGS="$ASFLAGS -DPREFIX"
        else
            ASFLAGS="$ASFLAGS -f elf -m amd64"
        fi
        ;;
    powerpc|powerpc64)
        ARCH="PPC"
        if [ $asm = auto ] ; then
            define HAVE_ALTIVEC
            AS="${AS-${cross_prefix}gcc}"
            if [ $SYS = MACOSX ] ; then
                CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
            else
                CFLAGS="$CFLAGS -maltivec -mabi=altivec"
                define HAVE_ALTIVEC_H
            fi
        fi
        ;;
    sparc)
        ARCH="SPARC"
        case $(uname -m) in
            sun4u|sun4v)
                if [ $asm = auto ]; then
                    ARCH="UltraSPARC"
                    if ! echo $CFLAGS | grep -Eq '\-mcpu' ; then
                        CFLAGS="$CFLAGS -mcpu=ultrasparc"
                        LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
                    fi
                    AS="${AS-${cross_prefix}as}"
                    ASFLAGS="$ASFLAGS -xarch=v8plusa"
                fi
                ;;
        esac
        ;;
    mips|mipsel|mips64|mips64el)
        ARCH="MIPS"
        ;;
    arm*)
        ARCH="ARM"
        if [ "$SYS" = MACOSX ] ; then
            AS="${AS-extras/gas-preprocessor.pl $CC}"
            ASFLAGS="$ASFLAGS -DPREFIX -DPIC"  # apple's ld doesn't support movw/movt relocations at all
            # build for armv7 by default
            if ! echo $CFLAGS | grep -Eq '\-arch' ; then
                CFLAGS="$CFLAGS -arch armv7"
                LDFLAGS="$LDFLAGS -arch armv7"
            fi
        else
            AS="${AS-${cross_prefix}gcc}"
        fi
        ;;
    s390|s390x)
        ARCH="S390"
        ;;
    parisc|parisc64)
        ARCH="PARISC"
        ;;
    ia64)
        ARCH="IA64"
        ;;
    *)
        ARCH="$(echo $host_cpu | tr a-z A-Z)"
        ;;
esac

log_msg "x264 configure script"
if [ -n "$*" ]; then
    msg="Command line options:"
    for i in $@; do
        msg="$msg \"$i\""
    done
    log_msg "$msg"
fi
log_msg ""

# check requirements

cc_check || die "No working C compiler found."

if [ $compiler != ICL ]; then
    if cc_check '' -std=gnu99 'for( int i = 0; i < 9; i++ );' ; then
        CFLAGS="$CFLAGS -std=gnu99"
    elif cc_check '' -std=c99 'for( int i = 0; i < 9; i++ );' ; then
        CFLAGS="$CFLAGS -std=c99 -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE"
    elif ! cc_check '' '' 'for( int i = 0; i < 9; i++ );' ; then
        die "C99 compiler is needed for compilation."
    fi
fi

if [ $shared = yes -a \( $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" -o $ARCH = "ARM" -o $ARCH = "IA64" \) ] ; then
    pic="yes"
fi

if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then
    if ! as_check "vpaddw xmm0, xmm0, xmm0" ; then
        VER=`($AS --version || echo no assembler) 2>/dev/null | head -n 1`
        echo "Found $VER"
        echo "Minimum version is yasm-0.7.0"
        echo "If you really want to compile without asm, configure with --disable-asm."
        exit 1
    fi
    if ! cc_check '' '' '__asm__("pabsw %xmm0, %xmm0");' ; then
        VER=`(${cross_prefix}as --version || echo no gnu as) 2>/dev/null | head -n 1`
        echo "Found $VER"
        echo "Minimum version is binutils-2.17"
        echo "Your compiler can't handle inline SSSE3 asm."
        echo "If you really want to compile without asm, configure with --disable-asm."
        exit 1
    fi
    define HAVE_MMX
fi

if [ $asm = auto -a $ARCH = ARM ] ; then
    # set flags so neon is built by default
    echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu|-mfloat-abi)' || CFLAGS="$CFLAGS -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp"

    if  cc_check '' '' '__asm__("rev ip, ip");' ; then      define HAVE_ARMV6
        cc_check '' '' '__asm__("movt r0, #0");'         && define HAVE_ARMV6T2
        cc_check '' '' '__asm__("vadd.i16 q0, q0, q0");' && define HAVE_NEON
        ASFLAGS="$ASFLAGS $CFLAGS -c"
    else
        echo "You specified a pre-ARMv6 or Thumb-1 CPU in your CFLAGS."
        echo "If you really want to run on such a CPU, configure with --disable-asm."
        exit 1
    fi
fi

[ $asm = no ] && AS=""
[ "x$AS" = x ] && asm="no" || asm="yes"

define ARCH_$ARCH
define SYS_$SYS

# skip endianness check for Intel Compiler, as all supported platforms are little. the -ipo flag will also cause the check to fail
if [ $compiler = GNU ]; then
    echo "int i[2] = {0x42494745,0}; double f[2] = {0x1.0656e6469616ep+102,0};" > conftest.c
    $CC $CFLAGS conftest.c -c -o conftest.o 2>/dev/null || die "endian test failed"
    if (${cross_prefix}strings -a conftest.o | grep -q BIGE) && (${cross_prefix}strings -a conftest.o | grep -q FPendian) ; then
        define WORDS_BIGENDIAN
    elif !(${cross_prefix}strings -a conftest.o | grep -q EGIB && ${cross_prefix}strings -a conftest.o | grep -q naidnePF) ; then
        die "endian test failed"
    fi
fi

# autodetect options that weren't forced nor disabled

# pthread-win32 is lgpl, prevent its use if --disable-gpl is specified and targeting windows
[ "$SYS" = "WINDOWS" -a "$gpl" = "no" -a "$thread" = "auto" ] && thread="win32"

libpthread=""
if [ "$thread" = "auto" ]; then
    thread="no"
    case $SYS in
        BEOS)
            thread="beos"
            define HAVE_BEOSTHREAD
            ;;
        WINDOWS)
            if cc_check pthread.h -lpthread "pthread_create(0,0,0,0);" ; then
                thread="posix"
                libpthread="-lpthread"
            elif cc_check pthread.h -lpthreadGC2 "pthread_create(0,0,0,0);" ; then
                thread="posix"
                libpthread="-lpthreadGC2"
            elif cc_check pthread.h "-lpthreadGC2 -lwsock32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
                thread="posix"
                libpthread="-lpthreadGC2 -lwsock32"
                define PTW32_STATIC_LIB
            elif cc_check pthread.h "-lpthreadGC2 -lws2_32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
                thread="posix"
                libpthread="-lpthreadGC2 -lws2_32"
                define PTW32_STATIC_LIB
            else
                # default to native threading if pthread-win32 is unavailable
                thread="win32"
            fi
            ;;
        OPENBSD)
            cc_check pthread.h -pthread && thread="posix" && libpthread="-pthread"
            ;;
        *)
            cc_check pthread.h -lpthread && thread="posix" && libpthread="-lpthread"
            ;;
    esac
fi
if [ "$thread" = "posix" ]; then
    LDFLAGS="$LDFLAGS $libpthread"
    define HAVE_POSIXTHREAD
fi
if [ "$thread" = "win32" ]; then
    # cygwin does not support win32 threads
    if [ "$SYS" = "WINDOWS" ]; then
        define HAVE_WIN32THREAD
    else
        thread="no"
    fi
fi
[ "$thread" != "no" ] && define HAVE_THREAD

if cc_check "math.h" "-Werror" "return log2f(2);" ; then
    define HAVE_LOG2F
fi

if [ "$vis" = "yes" ] ; then
    save_CFLAGS="$CFLAGS"
    CFLAGS="$CFLAGS -I/usr/X11R6/include"
    if cc_check "X11/Xlib.h" "-L/usr/X11R6/lib -lX11" "XOpenDisplay(0);" ; then
        LDFLAGS="-L/usr/X11R6/lib -lX11 $LDFLAGS"
        define HAVE_VISUALIZE
    else
        vis="no"
        CFLAGS="$save_CFLAGS"
   fi
fi

if [ "$swscale" = "auto" ] ; then
    swscale="no"
    if ${cross_prefix}pkg-config --exists libswscale 2>/dev/null; then
        SWSCALE_LIBS="$SWSCALE_LIBS $(${cross_prefix}pkg-config --libs libswscale)"
        SWSCALE_CFLAGS="$SWSCALE_CFLAGS $(${cross_prefix}pkg-config --cflags libswscale)"
    fi
    [ -z "$SWSCALE_LIBS" ] && SWSCALE_LIBS="-lswscale -lavutil"

    if cc_check "libswscale/swscale.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "sws_init_context(0,0,0);" ; then
        if cc_check "libavutil/pixdesc.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "av_get_pix_fmt_name(0);" ; then
            swscale="yes"
        else
            echo "Warning: av_get_pix_fmt_name is missing from libavutil, update for swscale support"
        fi
    fi
fi

if [ "$lavf" = "auto" ] ; then
    lavf="no"
    if ${cross_prefix}pkg-config --exists libavformat libavcodec libswscale 2>/dev/null; then
        LAVF_LIBS="$LAVF_LIBS $(${cross_prefix}pkg-config --libs libavformat libavcodec libavutil libswscale)"
        LAVF_CFLAGS="$LAVF_CFLAGS $(${cross_prefix}pkg-config --cflags libavformat libavcodec libavutil libswscale)"
    fi
    if [ -z "$LAVF_LIBS" -a -z "$LAVF_CFLAGS" ]; then
        LAVF_LIBS="-lavformat"
        for lib in -lpostproc -lavcodec -lavcore -lswscale -lavutil -lm -lz -lbz2 $libpthread -lavifil32; do
            cc_check "" $lib && LAVF_LIBS="$LAVF_LIBS $lib"
        done
    fi
    LAVF_LIBS="-L. $LAVF_LIBS"
    if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LIBS" "avcodec_decode_video2(0,0,0,0);" ; then
        if cpp_check libavcodec/avcodec.h "$LAVF_CFLAGS $LAVF_LIBS" "LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,64,0)" ; then
            if [ "$swscale" = "yes" ]; then
                lavf="yes"
            else
                echo "Warning: libavformat is not supported without swscale support"
            fi
        else
            echo "Warning: libavcodec is too old, update to ffmpeg r22735+"
        fi
    fi
fi

if [ "$ffms" = "auto" ] ; then
    ffms_major="2"; ffms_minor="14"; ffms_micro="0"; ffms_bump="0"
    ffms="no"

    if ${cross_prefix}pkg-config --exists ffms2 2>/dev/null; then
        FFMS2_LIBS="$FFMS2_LIBS $(${cross_prefix}pkg-config --libs ffms2)"
        FFMS2_CFLAGS="$FFMS2_CFLAGS $(${cross_prefix}pkg-config --cflags ffms2)"
    fi
    [ -z "$FFMS2_LIBS" ] && FFMS2_LIBS="-lffms2"

    if cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS" "FFMS_DestroyVideoSource(0);" ; then
        ffms="yes"
    elif cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS -lstdc++ $LAVF_LIBS" "FFMS_DestroyVideoSource(0);" ; then
        ffms="yes"
        FFMS2_LIBS="$FFMS2_LIBS -lstdc++ $LAVF_LIBS"
    fi

    error="ffms must be at least version $ffms_major.$ffms_minor.$ffms_micro.$ffms_bump"
    if [ $ffms = "yes" ] && ! cpp_check "ffms.h" "$FFMS2_CFLAGS" "FFMS_VERSION >= (($ffms_major << 24) | ($ffms_minor << 16) | ($ffms_micro << 8) | $ffms_bump)" "$error"; then
       ffms="no"
       echo "Warning: $error"
    fi
    if [ "$ffms" = "yes" -a "$swscale" = "no" ]; then
        echo "Warning: ffms is not supported without swscale support"
        ffms="no"
    fi
fi

if [ "$swscale" = "yes" ]; then
    LDFLAGSCLI="$SWSCALE_LIBS $LDFLAGSCLI"
    CFLAGS="$CFLAGS $SWSCALE_CFLAGS"
    define HAVE_SWSCALE
    if [ "$lavf" = "yes" ]; then
        LDFLAGSCLI="$LAVF_LIBS $LDFLAGSCLI"
        CFLAGS="$CFLAGS $LAVF_CFLAGS"
        define HAVE_LAVF
    fi
    if [ "$ffms" = "yes" ]; then
        LDFLAGSCLI="$FFMS2_LIBS $LDFLAGSCLI"
        CFLAGS="$CFLAGS $FFMS2_CFLAGS"
        define HAVE_FFMS
    fi
fi

if [ $SYS = WINDOWS ]; then
    GPAC_LIBS="-lwinmm"
fi
if [ "$gpac" = "auto" ] ; then
    gpac="no"
    cc_check "" -lz && GPAC_LIBS="-lgpac_static -lz" || GPAC_LIBS="-lgpac_static"
    if [ "$SYS" = "WINDOWS" ] ; then
        GPAC_LIBS="$GPAC_LIBS -lwinmm"
    fi
    if cc_check gpac/isomedia.h "$GPAC_LIBS" ; then
        if cc_check gpac/isomedia.h "$GPAC_LIBS" "gf_isom_set_pixel_aspect_ratio(0,0,0,0,0);" ; then
            gpac="yes"
        else
            echo "Warning: gpac is too old, update to 2007-06-21 UTC or later"
        fi
    fi
fi
if [ "$gpac" != "no" ] ; then
    define HAVE_GPAC
    if cc_check gpac/isomedia.h "-Werror $GPAC_LIBS" "gf_malloc(1); gf_free(NULL);" ; then
        define HAVE_GF_MALLOC
    fi
    LDFLAGSCLI="$GPAC_LIBS $LDFLAGSCLI"
fi

if [ "$avs" = "auto" ] ; then
    avs="no"
    # cygwin can use avisynth if it can use LoadLibrary
    if [ $SYS = WINDOWS ] || ([ $SYS = CYGWIN ] && cc_check windows.h "" "LoadLibrary(0);") ; then
        avs="yes"
        define HAVE_AVS
    fi
fi

cc_check "stdint.h" "" "uint32_t test_vec __attribute__ ((vector_size (16))) = {0,1,2,3};" && define HAVE_VECTOREXT

if [ "$pic" = "yes" ] ; then
    CFLAGS="$CFLAGS -fPIC"
    ASFLAGS="$ASFLAGS -DPIC"
    # resolve textrels in the x86 asm
    cc_check stdio.h -Wl,-Bsymbolic && LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
fi

if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
    CFLAGS="$CFLAGS -fomit-frame-pointer"
fi

if [ "$strip" = "yes" ]; then
    CFLAGS="$CFLAGS -s"
    LDFLAGS="$LDFLAGS -s"
fi

if [ "$debug" = "yes" ]; then
    CFLAGS="-O1 -g $CFLAGS"
elif [ $ARCH = ARM ]; then
    # arm-gcc-4.2 produces incorrect output with -ffast-math
    # and it doesn't save any speed anyway on 4.4, so disable it
    CFLAGS="-O3 -fno-fast-math $CFLAGS"
else
    CFLAGS="-O3 -ffast-math $CFLAGS"
fi

if cc_check '' -fno-tree-vectorize ; then
    CFLAGS="$CFLAGS -fno-tree-vectorize"
fi

if [ $SYS = WINDOWS -a $ARCH = X86 -a $compiler = GNU ] ; then
    # workaround gcc/ld bug with alignment of static variables/arrays that are initialized to zero
    cc_check '' -fno-zero-initialized-in-bss && CFLAGS="$CFLAGS -fno-zero-initialized-in-bss"
fi

if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
    define fseek fseeko
    define ftell ftello
elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
    define fseek fseeko64
    define ftell ftello64
elif cc_check "stdio.h" "" "_fseeki64(stdin,0,0);" ; then
    define fseek _fseeki64
    define ftell _ftelli64
fi

if cc_check '' -Wshadow ; then
    CFLAGS="-Wshadow $CFLAGS"
fi

if [ "$bit_depth" -gt "8" ]; then
    define HIGH_BIT_DEPTH
    ASFLAGS="$ASFLAGS -DHIGH_BIT_DEPTH"
fi

ASFLAGS="$ASFLAGS -DBIT_DEPTH=$bit_depth"

[ $gpl = yes ] && define HAVE_GPL && x264_gpl=1 || x264_gpl=0

[ $interlaced = yes ] && define HAVE_INTERLACED && x264_interlaced=1 || x264_interlaced=0

#define undefined vars as 0
for var in $CONFIG_HAVE; do
    grep -q "HAVE_$var 1" config.h || define HAVE_$var 0
done

if [ $compiler = ICL ]; then
    AR="xilib -nologo -out:"
    DEPMM=-QMM
    DEPMT=-QMT
    HAVE_GETOPT_LONG=0
    LD="xilink -out:"
    LDFLAGS="-nologo -incremental:no $(icl_ldflags $LDFLAGS)"
    LDFLAGSCLI="$(icl_ldflags $LDFLAGSCLI)"
    LIBX264=libx264.lib
    RANLIB=
    STRIP=
    if [ $debug = yes ]; then
        LDFLAGS="-debug $LDFLAGS"
        CFLAGS="-D_DEBUG $CFLAGS"
    else
        CFLAGS="-DNDEBUG $CFLAGS"
    fi
else
    AR="$AR rc "
    DEPMM="-MM -g0"
    DEPMT="-MT"
    LD="$CC -o "
    LIBX264=libx264.a
fi
if [ $compiler = GNU ]; then
    PROF_GEN_CC="-fprofile-generate"
    PROF_GEN_LD="-fprofile-generate"
    PROF_USE_CC="-fprofile-use"
    PROF_USE_LD="-fprofile-use"
else
    CFLAGS="$(intel_cflags $CFLAGS)"
    # icc does not define __SSE__ until SSE2 optimization and icl never defines it or _M_IX86_FP
    [ \( $ARCH = X86_64 -o $ARCH = X86 \) -a $asm = yes ] && ! cpp_check "" "" "defined(__SSE__)" && define __SSE__
    PROF_GEN_CC="${QPRE}prof-gen ${QPRE}prof-dir."
    PROF_GEN_LD=
    PROF_USE_CC="${QPRE}prof-use ${QPRE}prof-dir."
    PROF_USE_LD=
fi

rm -f conftest*

# generate exported config file

cat > x264_config.h << EOF
#define X264_BIT_DEPTH  $bit_depth
#define X264_GPL        $x264_gpl
#define X264_INTERLACED $x264_interlaced
EOF

# generate config files

cat > config.mak << EOF
prefix=$prefix
exec_prefix=$exec_prefix
bindir=$bindir
libdir=$libdir
includedir=$includedir
ARCH=$ARCH
SYS=$SYS
CC=$CC
CFLAGS=$CFLAGS
DEPMM=$DEPMM
DEPMT=$DEPMT
LD=$LD
LDFLAGS=$LDFLAGS
LIBX264=$LIBX264
AR=$AR
RANLIB=$RANLIB
STRIP=$STRIP
AS=$AS
ASFLAGS=$ASFLAGS
EXE=$EXE
MP4=$gpac
HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
DEVNULL=$DEVNULL
PROF_GEN_CC=$PROF_GEN_CC
PROF_GEN_LD=$PROF_GEN_LD
PROF_USE_CC=$PROF_USE_CC
PROF_USE_LD=$PROF_USE_LD
EOF

if [ $compiler = ICL ]; then
    echo '%.o: %.c' >> config.mak
    echo '	$(CC) $(CFLAGS) -c -Fo$@ $<' >> config.mak
fi

if [ "$cli" = "yes" ]; then
    echo 'default: cli' >> config.mak
    echo 'install: install-cli' >> config.mak
fi

if [ "$shared" = "yes" ]; then
    API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
    if [ "$SYS" = "WINDOWS" -o "$SYS" = "CYGWIN" ]; then
        echo "SONAME=libx264-$API.dll" >> config.mak
        if [ $compiler = ICL ]; then
            echo 'IMPLIBNAME=libx264.dll.lib' >> config.mak
            # GNU ld on windows defaults to exporting all global functions if there are no explicit __declspec(dllexport) declarations
            # MSVC link does not act similarly, so it is required to make an export definition out of x264.h and use it at link time
            echo 'SOFLAGS=-dll -def:x264.def -implib:$(IMPLIBNAME)' >> config.mak
            echo "EXPORTS" > x264.def
            grep "^\(int\|void\|x264_t\|extern\).*x264.*[\[(;]" x264.h | sed -e "s/.*\(x264.*\)[\[(].*/\1/;s/.*\(x264.*\);/\1/;s/open/open_$API/g" >> x264.def
        else
            echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
            echo 'SOFLAGS=-shared -Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
        fi
    elif [ "$SYS" = "MACOSX" ]; then
        echo "SOSUFFIX=dylib" >> config.mak
        echo "SONAME=libx264.$API.dylib" >> config.mak
        echo 'SOFLAGS=-shared -dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name $(DESTDIR)$(libdir)/$(SONAME)' >> config.mak
    elif [ "$SYS" = "SunOS" ]; then
        echo "SOSUFFIX=so" >> config.mak
        echo "SONAME=libx264.so.$API" >> config.mak
        echo 'SOFLAGS=-shared -Wl,-h,$(SONAME)' >> config.mak
    else
        echo "SOSUFFIX=so" >> config.mak
        echo "SONAME=libx264.so.$API" >> config.mak
        echo 'SOFLAGS=-shared -Wl,-soname,$(SONAME)' >> config.mak
    fi
    echo 'default: lib-shared' >> config.mak
    echo 'install: install-lib-shared' >> config.mak
fi

if [ "$static" = "yes" ]; then
    echo 'default: lib-static' >> config.mak
    echo 'install: install-lib-static' >> config.mak
fi

if [ "$cli_libx264" = "system" ] ; then
    if [ "$shared" = "yes" ]; then
        CLI_LIBX264='$(SONAME)'
    elif ${cross_prefix}pkg-config --exists x264 2>/dev/null; then
        LDFLAGSCLI="$LDFLAGSCLI $(${cross_prefix}pkg-config --libs x264)"
        CLI_LIBX264=
    else
        die "Can not find system libx264"
    fi
else
    CLI_LIBX264='$(LIBX264)'
fi
echo "LDFLAGSCLI = $LDFLAGSCLI" >> config.mak
echo "CLI_LIBX264 = $CLI_LIBX264" >> config.mak

./version.sh >> config.h

pclibs="-L$libdir -lx264 $libpthread"

cat > x264.pc << EOF
prefix=$prefix
exec_prefix=$exec_prefix
libdir=$libdir
includedir=$includedir

Name: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: $(grep POINTVER < config.h | sed -e 's/.* "//; s/".*//')
Libs: $pclibs
Cflags: -I$includedir
EOF

filters="crop select_every"
gpl_filters=""
[ $swscale = yes ] && filters="resize $filters"
[ $gpl = yes ] && filters="$filters $gpl_filters"

cat > conftest.log <<EOF
Platform:   $ARCH
System:     $SYS
cli:        $cli
libx264:    $cli_libx264
shared:     $shared
static:     $static
asm:        $asm
interlaced: $interlaced
avs:        $avs
lavf:       $lavf
ffms:       $ffms
gpac:       $gpac
gpl:        $gpl
thread:     $thread
filters:    $filters
debug:      $debug
gprof:      $gprof
strip:      $strip
PIC:        $pic
visualize:  $vis
bit depth:  $bit_depth
EOF

echo >> config.log
cat conftest.log >> config.log
cat conftest.log
rm conftest.log

echo
echo "You can run 'make' or 'make fprofiled' now."

